package global

import (
	"database/sql"
)

type (
	XPartitionSheetTatil struct {
		Seq               string `json:"任务序号"`
		Schema            string `json:"库名"`
		Table             string `json:"表名"`
		Name              string `json:"分区名"`
		Type              string `json:"分区类型"` //partition subPartition
		IssueType         string `json:"问题类型"` //name,type,rule，column
		SrcValue          string `json:"源端值"`
		DstValue          string `json:"目端值"`
		FixRecommendation string `json:"修复意见"`
		Comment           string `json:"备注"`
		FixSql            string `json:"修复语句"`
	}
	XPartitionSheetName struct {
		Terminal  string `json:"db2s_terminal"`
		Result    string `json:"partition_result"`
		MissTable string `json:"missTable"`
	}
)
type (
	SubPartitionMeta struct {
		Sum        string   `json:"sum"`        //partition 个数
		Func       []string `json:"func"`       //partition column 函数
		Name       string   `json:"name"`       //partition name
		Meth       string   `json:"meth"`       //partition fay range，hash，list，key
		ColumnName []string `json:"columnName"` //partition column name
		ColumnType []string `json:"columnType"` //partition column type
		Rules      string   `json:"rules"`      //partition rules
		Seq        string   `json:"seq"`        //partition name seq
	}
	TablePartitionConfig struct {
		Schema           string   `json:"schema"`
		Table            string   `json:"table"`
		ShardName        string   `json:"shardName"`
		BackendTableName string   `json:"backendTableName"`
		TableObject      string   `json:"tableObject"`
		PartColumnGather []string `json:"partColumnGather"`
		FirstPartition   SubPartitionMeta
		SubPartMeth      string
		SubPartMeta      []SubPartitionMeta
	}
	PartitionInput struct {
		LogSeq int64
		Schema string `json:"schema"`
		Table  string `json:"table"`
		Db     *sql.DB
	}
)
type (
	GetPartitionMeta struct {
		Schema              string   `json:"schema"`
		Table               string   `json:"table"`
		FirstPartName       string   `json:"firstPartName"`
		SubPartName         string   `json:"subPartName"`
		FirstPartSeq        string   `json:"firstPartSeq"`
		SubPartSeq          string   `json:"subPartSeq"`
		FirstPartMeth       string   `json:"firstPartMeth"`
		SubPartMeth         string   `json:"subPartMeth"`
		FirstPartColumn     []string `json:"firstPartColumn"`
		SubPartColumn       []string `json:"subPartColumn"`
		PartRul             string   `json:"partitionRules"`
		PartComment         string   `json:"partComment"`
		PartRulFormat       string   `json:"partRulFormat"`
		FirstPartColumnFunc []string `json:"firstPartColumnFunc"`
		SubPartColumnFunc   []string `json:"subPartColumnFunc"`
	}
	GetTableDistributed struct {
		Schema             string `json:"schema"`
		Table              string `json:"table"`
		DistributeMode     string `json:"mode"`
		ShardName          string `json:"shardName"`
		FirstPartitionName string `json:"firstPartitionName"`
		SubPartitionName   string `json:"subPartitionName"`
		BackendTableName   string `json:"backendTableName"`
	}
)
type (
	PartitionSummary struct {
		Sum           int64
		PartitionType string
	}
	PartitionType struct {
		Schema string `json:"schema"`
		Table  string `json:"table"`
		Type   string `json:"partitionType"`
	}
	SubPartitionType struct {
		Schema string `json:"schema"`
		Table  string `json:"table"`
		Type   string `json:"subPartitionType"`
	}
	PartitionName struct {
		Schema string `json:"schema"`
		Table  string `json:"table"`
		Name   string `json:"partitionName"`
		Seq    string `json:"partitionSeq"`
	}
	SubPartitionName struct {
		Schema  string `json:"schema"`
		Table   string `json:"table"`
		Name    string `json:"partitionName"`
		SubName string `json:"subPartitionName"`
		Seq     string `json:"partitionSeq"`
	}
	PartitionRules struct {
		Schema string `json:"schema"`
		Table  string `json:"table"`
		Name   string `json:"partitionName"`
		Rules  string `json:"partitionRules"`
		Seq    string `json:"partitionSeq"`
	}
	SubPartitionRules struct {
		Schema        string `json:"schema"`
		Table         string `json:"table"`
		PartitionName string `json:"partitionName"`
		Name          string `json:"subPartitionName"`
		Rules         string `json:"subPartitionRules"`
		Seq           string `json:"subPartitionSeq"`
	}
	PartitionColumn struct {
		Schema string `json:"schema"`
		Table  string `json:"table"`
		Name   string `json:"partitionColumnName"`
		Type   string `json:"partitionColumnType"`
	}
	SubPartitionColumn struct {
		Schema string `json:"schema"`
		Table  string `json:"table"`
		Name   string `json:"subPartitionColumnName"`
		Type   string `json:"subPartitionColumnType"`
	}
	PartitionInfo struct {
		Schema             string
		Table              string
		PartitionType      PartitionType
		SubPartitionType   SubPartitionType
		PartitionRules     []PartitionRules
		SubPartitionRules  []SubPartitionRules
		PartitionColumn    []PartitionColumn
		SubPartitionColumn []SubPartitionColumn
	}

	PartitionGarth struct { // partition source dest garth 用于数据写入和读取的操作
		Name              PartitionGarthName             //partition garth name list
		Shard             PartitionGarthShard            //partition garth shard name list
		BackendTableName  PartitionGarthBackendTableName //partition garth shard id list
		Logo              PartitionGarthLogo             //partition garth Logo
		Object            string
		SourceDestNameMap map[string] /*sourcePartitionName + destPartitionName*/ string `json:"sourceDestNameMap"` //原目标端都是partition，partition的名字映射
	}
	PartitionGarthName struct {
		Source []string `json:"sourceName"` //源端分区名集合
		Dest   []string `json:"destName"`   //目标端分区名集合
	}
	PartitionGarthShard struct {
		Source map[string] /*partitionName + partitionShard*/ string `json:"source"`
		Dest   map[string] /*partitionName + partitionShard*/ string `json:"dest"`
	}
	PartitionGarthBackendTableName struct {
		Source map[string] /*partitionName + BackendTableName*/ BackendTable `json:"sourceBackendTableNameMap"`
		Dest   map[string] /*partitionName + BackendTableName*/ BackendTable `json:"destBackendTableNameMap"` //目标端表的分区类型
	}
	PartitionGarthLogo struct {
		Source string `json:"sourceTablePartitionType"` //源端表的分区类型
		Dest   string `json:"destTablePartitionType"`   //目标端表的分区类型
	}
)

type (
	SubPartNameMerge struct {
		PartitionName    string
		ShardName        string
		BackendTableName string
	}
	FirstPartNameMerge struct {
		PartitionName    string
		ShardName        string
		BackendTableName string
		SubPart          []SubPartNameMerge
	}
	BackendTable struct {
		FirstPartitionName string `json:"firstPartitionName"`
		SubPartitionName   string `json:"subPartitionName"`
		ShardName          string `json:"shardName"`
		BackendTableName   string `json:"backendTableName"`
	}
	PartColumnMeta struct {
		Name      []string
		Type      []string
		CharSet   []string
		Collation []string
	}
	ManyLevelPartColumn struct {
		FirstPar PartColumnMeta
		SubPar   PartColumnMeta
	}
	FirstSubPartNameMargeData struct {
		FirstNameMapSubName   map[string] /*single first partitionName + many sub partitionName*/ []string
		PartitionNameGarth    []string                /* partition Name = firstPartName+ subPartName*/
		PartColumn            ManyLevelPartColumn     /*first and sub partition column metadata(column [name,type,charset,collation])*/
		PartMeth              string                  /*first partition meth + sub partition meth*/
		PartitionBackendShard map[string]BackendTable /*key(firstPartitionName + subPartitionName) => backendTable + shard*/
	}
)

type PartitionMetaS struct {
	Overview  PartOverviewS
	NameGarth []string //firstName+subName
	Shard     []PartShardS
}
